# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：5.07 递归.py
# 开发时间：2021/3/24 18:39

# 尝试求10的阶乘
# 1！=1
# 2!=1*2
# n!=1*2*3*...*n

# for循环（初次尝试编写）
def factorial1(factorial_num=1):
    result1 = 1
    factorial_num += 1
    for i in range(1, factorial_num):
        result1 *= i
    return result1


print('10的阶乘 = ', factorial1(10))


# 函数递归
def factorial2(factorial_num):
    """
    该函数用来求任意数n的阶乘
    :return: result，阶乘的积
    """
    result2 = factorial_num
    for i in range(1, factorial_num):
        result2 *= i
    return result2


print('10的阶乘 = ', factorial1(10))


# 递归是解决问题的一种方式，它和循环很像
#   它的整体思想是，将一个大的问题，分解为一个个小问题，直到问题无法分解时，再去解决问题
# 递归式函数的两个条件
# 1.基线条件
#   - 问题可以被分解为最小的问题，当满足了基线条件时，递归就不再执行
# 10! = 10 * 9!
# 9! = 9 * 8!
# ...
# 2! = 2 * 1!
# 1! = 1
# 2.递归条件
#   - 将问题继续分解的条件

def factorial3(n):
    """
    该函数求任意数的阶乘
    :param n:要求阶乘n!的数字
    :return:
    """
    # 基线条件 判断n是否为1，如果为1则不再继续递归
    if n == 1:
        # 1的阶乘就是1，直接返回1
        return 1
    # 递归条件
    return n * factorial3(n - 1)


print('n = 10 时的n! = ', factorial3(10))


# 练习1：创建一个 power 来为任意数字 做幂运算 n**i，不使用**
def power(n, i):
    """
    该函数对n做i次幂运算
    :param n: n是一个底数
    :param i: i是一个幂数
    :return: 返回一个幂运算的结果
    """
    # n为底的1次方，是自己
    result3 = n
    # 如果0次方，为1，直接return
    if i == 0:
        return 1
    else:
        # 执行剩下的次幂i-1次循环，result * n^(i-1)
        for i1 in range(1, i):
            result3 *= n
        # 计算结束，返回幂运算结果
        return result3


# 调用power函数
print('n^i = ', power(2, 3))


# 练习2：创建一个函数，用来检查一个任意的字符串是否是回文字符串，如果是，返回True
#   - 回文字符串，字符串从前往后念h和从后往前念是一样的
def reply(my_str1):
    # 将输入的字符串my_str转换为列表
    raw_str = list(my_str1)
    # 浅复制新对象给reply_str，这样修改reply_str不会影响my_str
    reply_str = raw_str.copy()
    # 对reply_str 反转
    reply_str.reverse()
    # 判断是否是回文字符串
    if raw_str == reply_str:
        return True
    else:
        return False


my_str = 'wow'
result = reply(my_str)
print('该字符串', my_str, '是否是回文字符串：', result)


# 练习1：创建一个 power 来为任意数字 做幂运算 n**i，不使用**（看了视频之后）
def power(n, i):
    """
    该函数对n做i次幂运算
    :param n: n是一个底数
    :param i: i是一个幂数
    :return: 返回一个幂运算的结果
    """
    # 基线条件
    if i == 1:
        return n
    # 递归条件
    return n * power(n, i - 1)


# 调用power函数
print(power(2, 3))


# 练习2：创建一个函数，用来检查一个任意的字符串是否是回文字符串，如果是，返回True(看过视频之后)
#   - 回文字符串，字符串从前往后念h和从后往前念是一样的
def hui_wen(s):
    """
    # 练习2：创建一个函数，用来检查一个任意的字符串是否是回文字符串，如果是，返回True
#   - 回文字符串，字符串从前往后念h和从后往前念是一样的
    :param s: 需要检查的字符串
    :return:
    """
    # 基线条件
    if len(s) < 2:
        # 字符串长度小于2，则字符串一定是回文
        return True
    elif s[0] != s[-1]:
        return False
    # 递归条件
    return hui_wen(s[1:-1])


print(hui_wen('wow'))
